﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lola.DTO.Grilla;

namespace Lola.Datos.Persistencia
{
    /// <summary>
    /// persistencia de micro
    /// </summary>
    public static class pMicro
    {
        public static Micro buscarMicro(int numint)
        {
            using (SeminarioIEntities contextSeminarioI = new SeminarioIEntities())
            {
                var query = from p in contextSeminarioI.Microes
                            where p.numInt == numint
                            select p;
                Micro mi = query.First();
                return mi;
            }
        }

        /// <summary>
        /// Obtiene todos los micros en un sector. Si obtiene los de porteria
        /// se esta teniendo todos los del galpon...
        /// </summary>
        /// <param name="sector"></param>
        /// <param name="galpon"></param>
        /// <returns></returns>
        public static List<Micro> ObtenerMicrosenSector(String sector, String galpon)
        {
            List<Micro> res = new List<Micro>();
            using (SeminarioIEntities contexto = new SeminarioIEntities())
            {
                IQueryable lista = from m in contexto.InformeSectors
                                   where m.SectorGalpon.Sector.nomSec.Equals(sector) & 
                                   m.SectorGalpon.Galpon.nomGal.Equals(galpon) & 
                                   m.fechaEntrada.HasValue & !m.fechaSalida.HasValue
                                   select m.Servicio.Micro;
                foreach (Micro m in lista)
                {
                    res.Add(m);
                }
            }
            return res;
        }
        /// <summary>
        /// Obtiene todos los micros de la base. Traigo solamente los que tienen servicios.
        /// </summary>
        /// <param name="numint"></param>
        /// <returns></returns>
        public static List<Micro> obtenerMicros()
        {
            List<Micro> res = new List<Micro>();
            using (SeminarioIEntities contextSeminarioI = new SeminarioIEntities())
            {
                var query = from p in contextSeminarioI.Servicios
                            select p.Micro;
                foreach (Micro m in query)
                {
                    res.Add(m);
                }
            }
            return res;
        }
        
        /// <summary>
        /// Devuelve un listado de los micros que pueden ingresar al galpon.
        /// </summary>
        /// <returns></returns>
        public static List<DTO.Grilla.dtoMicroGrilla> getMicrosDisponibles()
        {
            List<Servicio> servicios = new List<Servicio>();
            List<Micro> micros = new List<Micro>();
            List<Micro> microsenGalpon = new List<Micro>();
            List<DTO.Grilla.dtoMicroGrilla> resultado = new List<DTO.Grilla.dtoMicroGrilla>();

            using (SeminarioIEntities context = new SeminarioIEntities())
            {
                var query1 = from m in context.Microes select m;
                var query2 = from isec in context.InformeSectors
                    where isec.SectorGalpon.Sector.nomSec.Equals("Porteria") & isec.fechaEntrada.HasValue & !isec.fechaSalida.HasValue
                    select isec.Servicio.Micro;
                
                var query3 = from ser in context.Servicios select ser;
                foreach (Servicio s in query3)
                {
                    servicios.Add(s);
                }
                
                foreach (Micro m in query2)
                {
                    microsenGalpon.Add(m);
                }

                foreach (Servicio ser in servicios)
                {
                    bool ensartar = true;
                    foreach (Micro miceng in microsenGalpon)
                    {
                        if (ser.Micro.numInt.Equals(miceng.numInt))
                        {
                            ensartar = false;
                            break;
                        }
                    }
                    if (ensartar)
                    {
                        resultado.Add(new DTO.Grilla.dtoMicroGrilla(ser.Micro.numInt, ser.Micro.paten, ser.Micro.calidad, ser.cod, ser.fechaSalidaSer.ToString()));  
                    } 
                }
            }

            return resultado;
        }

        /// <summary>
        /// Devuelve los micros que pueden ingresar a los sectores internos del deposito.
        /// </summary>
        /// <returns></returns>
        public static List<DTO.Grilla.dtoMicroGrilla> getMicrosDisponiblesParaSector(String galpon, String sector)
        {
            List<Servicio> servicios = new List<Servicio>();
            List<Micro> micros = new List<Micro>();
            List<Micro> microsenGalpon = new List<Micro>();
            List<DTO.Grilla.dtoMicroGrilla> resultado = new List<DTO.Grilla.dtoMicroGrilla>();

            /**
             * El comportamiento no puede ser el mismo para cada sector. 
             * Taller tiene que ver todos los que ingresaron a porteria y todavia no salieron.
             * Limpieza tiene que ver todos los que ya salieron de taller y todavia no entraron a limpieza
             * Suministros tiene que ver todos los que salieron de limpieza y no entraron a suministros
             * 
             * */

            using (SeminarioIEntities context = new SeminarioIEntities())
            {
                // todos los micros
                var query1 = from m in context.Microes select m;

                // todos los micros en porteria
                var qPorteria = from isec in context.InformeSectors
                                where isec.SectorGalpon.Sector.nomSec.Equals("Porteria") & isec.fechaEntrada.HasValue & !isec.fechaSalida.HasValue
                                select isec;

                // me fijo para todos los servicios que no hayan salido de porteria, los que no hayan entrado al sector actual
                // y hayan salido del anterior, salvo para taller que solamente con entrar en porteria pueden
                // entrar al taller

                foreach (InformeSector iss in qPorteria)
                {
                    // reviso que existan entradas al sector sin fecha de entrada confirmada
                    var q = from i in context.InformeSectors
                            where i.Servicio.cod == iss.Servicio.cod
                            & i.SectorGalpon.Galpon.nomGal == galpon
                            & i.SectorGalpon.Sector.nomSec == sector
                            & !i.fechaEntrada.HasValue
                            select i;

                    if (sector == "Taller")
                    {
                        // Para los de taller no busco nada mas, solamente los ingreso si es que no existen en el taller
                        if (q.Count() != 0)
                        {
                            resultado.Add(new DTO.Grilla.dtoMicroGrilla(
                                iss.Servicio.Micro.numInt, 
                                iss.Servicio.Micro.paten, 
                                iss.Servicio.Micro.calidad, 
                                iss.Servicio.cod, 
                                iss.Servicio.fechaSalidaSer.ToString()));    
                        }
                    }

                    // Para Limpieza tengo que ver que haya salido de Taller
                    // y para Suministros tengo que ver que haya salido de Limpieza

                    if (sector == "Limpieza")
                    {
                            // reviso si existe un registro de haber salido del taller
                            var qq = from i in context.InformeSectors
                            where i.Servicio.cod == iss.Servicio.cod
                            & i.SectorGalpon.Galpon.nomGal == galpon
                            & i.SectorGalpon.Sector.nomSec == "Taller"
                            & i.fechaSalida.HasValue
                            select i;
                            if (q.Count()!=0 & qq.Count() !=0)
                            {
                                resultado.Add(new DTO.Grilla.dtoMicroGrilla(
                                    iss.Servicio.Micro.numInt, 
                                    iss.Servicio.Micro.paten, 
                                    iss.Servicio.Micro.calidad, 
                                    iss.Servicio.cod, 
                                    iss.Servicio.fechaSalidaSer.ToString()));
                            }
                    }

                    if (sector == "Suministros")
                    {
                        // reviso si existe un registro de haber salido de limpieza
                        var qq = from i in context.InformeSectors
                                 where i.Servicio.cod == iss.Servicio.cod
                                 & i.SectorGalpon.Galpon.nomGal == galpon
                                 & i.SectorGalpon.Sector.nomSec == "Limpieza"
                                 & i.fechaSalida.HasValue
                                 select i;
                        if (q.Count() != 0 & qq.Count() != 0)
                        {
                            resultado.Add(new DTO.Grilla.dtoMicroGrilla(
                                iss.Servicio.Micro.numInt,
                                iss.Servicio.Micro.paten,
                                iss.Servicio.Micro.calidad,
                                iss.Servicio.cod,
                                iss.Servicio.fechaSalidaSer.ToString()));
                        }
                    }

                }
            }
            return resultado;
        }

        public static List<DTO.Grilla.dtoGrillaTrafico> obtenerMicrosenGalponTrafico(string galpon)
        {
            List<dtoGrillaTrafico> res = new List<DTO.Grilla.dtoGrillaTrafico>();

            using (SeminarioIEntities con = new SeminarioIEntities())
            {
                IQueryable lista = from m in con.InformeSectors
                                    where m.SectorGalpon.Sector.nomSec.Equals("Porteria") &
                                    m.SectorGalpon.Galpon.nomGal.Equals(galpon) &
                                    m.fechaEntrada.HasValue & !m.fechaSalida.HasValue
                                    select m;
                foreach (InformeSector isec in lista)
                {
                    dtoGrillaTrafico newD = new dtoGrillaTrafico();
                    newD.CodigoServicio = isec.Servicio.cod;
                    newD.Destino = isec.Servicio.destino;
                    newD.FechaEntrada = isec.fechaEntrada.ToString();
                    newD.FechaSalidaPrevista = isec.fechaPrevistaSalida.ToString();
                    newD.FechaSalidaServicio = isec.Servicio.fechaSalidaSer.ToString();
                    newD.Interno = isec.Servicio.Micro.numInt;
                    newD.Origen = isec.Servicio.origen;
                    

                    dtoGrillaTraficoSector sec = new dtoGrillaTraficoSector();
                    sec.FechaEntrada = newD.FechaEntrada;
                    sec.FechaEntradaPrevista = isec.fechaPrevistaEntrada.ToString();
                    sec.FechaSalidaPrevista = isec.fechaPrevistaSalida.ToString();
                    sec.SectorNombre = "Porteria";
                    newD.Sector = "Porteria";
                    newD.Sectores.Add(sec);

                    var q = from iis in con.InformeSectors
                            where iis.Servicio.cod == isec.cod
                            & iis.SectorGalpon.Galpon.nomGal == galpon
                            & iis.SectorGalpon.Sector.nomSec == "Taller"
                            select iis;
                    
                    InformeSector ist = q.First();

                    dtoGrillaTraficoSector sec2 = new dtoGrillaTraficoSector();
                    sec2.FechaEntrada = ist.fechaEntrada.ToString() ;
                    sec2.FechaSalida = ist.fechaSalida.ToString();
                    sec2.FechaEntradaPrevista = ist.fechaPrevistaEntrada.ToString();
                    sec2.FechaSalidaPrevista = ist.fechaPrevistaSalida.ToString();
                    sec2.SectorNombre = "Taller";
                    if (ist.fechaEntrada.HasValue)
                    {
                        newD.Sector = "Taller";
                    }
                    newD.Sectores.Add(sec2);
                    if (ist.fechaSalida.HasValue)
                    {
                        newD.Atrasado = ist.fechaSalida > ist.fechaPrevistaSalida;
                    }
                    else
                    {
                        if (ist.fechaEntrada.HasValue)
                        {
                            newD.Atrasado = ist.fechaPrevistaEntrada > ist.fechaEntrada;
                        }
                        else
                        {
                            newD.Atrasado = ist.fechaPrevistaEntrada > DateTime.Now;
                        }
                        
                    }

                    q = from iis in con.InformeSectors
                            where iis.Servicio.cod == isec.cod
                            & iis.SectorGalpon.Galpon.nomGal == galpon
                            & iis.SectorGalpon.Sector.nomSec == "Limpieza"
                            select iis;

                    ist = q.First();

                    sec2 = new dtoGrillaTraficoSector();
                    sec2.FechaEntrada = ist.fechaEntrada.ToString();
                    sec2.FechaSalida = ist.fechaSalida.ToString();
                    sec2.FechaEntradaPrevista = ist.fechaPrevistaEntrada.ToString();
                    sec2.FechaSalidaPrevista = ist.fechaPrevistaSalida.ToString();
                    sec2.SectorNombre = "Limpieza";
                    if (ist.fechaEntrada.HasValue)
                    {
                        newD.Sector = "Limpieza";
                    }
                    newD.Sectores.Add(sec2);
                    if (ist.fechaSalida.HasValue)
                    {
                        newD.Atrasado = ist.fechaSalida > ist.fechaPrevistaSalida;
                    }
                    else
                    {
                        if (ist.fechaEntrada.HasValue)
                        {
                            newD.Atrasado = ist.fechaPrevistaEntrada > ist.fechaEntrada;
                        }
                        else
                        {
                            newD.Atrasado = ist.fechaPrevistaEntrada > DateTime.Now;
                        }

                    }
                    q = from iis in con.InformeSectors
                        where iis.Servicio.cod == isec.cod
                        & iis.SectorGalpon.Galpon.nomGal == galpon
                        & iis.SectorGalpon.Sector.nomSec == "Suministros"
                        select iis;

                    ist = q.First();

                    sec2 = new dtoGrillaTraficoSector();
                    sec2.FechaEntrada = ist.fechaEntrada.ToString();
                    sec2.FechaSalida = ist.fechaSalida.ToString();
                    sec2.FechaEntradaPrevista = ist.fechaPrevistaEntrada.ToString();
                    sec2.FechaSalidaPrevista = ist.fechaPrevistaSalida.ToString();
                    sec2.SectorNombre = "Suministros";
                    if (ist.fechaEntrada.HasValue)
                    {
                        newD.Sector = "Suministros";
                    }
                    newD.Sectores.Add(sec2);
                    if (ist.fechaSalida.HasValue)
                    {
                        newD.Atrasado = ist.fechaSalida > ist.fechaPrevistaSalida;
                    }
                    else
                    {
                        if (ist.fechaEntrada.HasValue)
                        {
                            newD.Atrasado = ist.fechaPrevistaEntrada > ist.fechaEntrada;
                        }
                        else
                        {
                            newD.Atrasado = ist.fechaPrevistaEntrada > DateTime.Now;
                        }

                    }

                    newD.Atrasado = isec.fechaPrevistaSalida < DateTime.Now;
                    var qi = from incis in con.Incidencias
                             where incis.Servicio.cod.Equals(isec.cod)
                             select incis;

                    newD.Incidencia = false;
                    foreach (Incidencia ic in qi)
                    {
                        newD.Incidencia = true;
                        newD.Incidencias.Add(new DTO.dtoIncidencia(
                            ic.numeroInc,
                            ic.fechInc,
                            ic.SectorGalpon.Sector.nomSec,
                            ic.gravedad,
                            ic.descrip,
                            ic.prioridad,
                            ic.cod,
                            ic.estado));
                    }
                    res.Add(newD);
                }
             
            }
            return res;
        }
    }
}
